//给你一个整数数组 nums ，找出并返回所有该数组中不同的递增子序列，递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
//
// 数组中可能含有重复元素，如出现两个整数相等，也可以视作递增序列的一种特殊情况。
//
//
//
// 示例 1：
//
//
//输入：nums = [4,6,7,7]
//输出：[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
//
//
// 示例 2：
//
//
//输入：nums = [4,4,3,2,1]
//输出：[[4,4]]
//
//
//
//
// 提示：
//
//
// 1 <= nums.length <= 15
// -100 <= nums[i] <= 100
//
//
// Related Topics 位运算 数组与矩阵 哈希表 回溯与递归 👍 652 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function findSubsequences(nums: number[]): number[][] {

    function backtracking(startIndex, temp) {
        if (temp.length >= 2) {
            res.push(temp.slice())
        }
        //? 精髓就在这里！这里管本层(递归到下一层这个会重新新建)
        //? 因为同一父节点下的同层上使用过的元素就不能再使用了如4 6 7 7用了第一个7就不能用第二个7（但是选了一个7后再递归到下一层仍然可以用另一个7）
        const set : Set<number> = new Set<number>()
        for (let i = startIndex; i < nums.length; i ++) {
            if (nums[i] < temp[temp.length - 1] || set.has(nums[i])) continue
            set.add(nums[i])
            temp.push(nums[i])
            backtracking(i + 1, temp)
            temp.pop()
        }
    }
    let res : number[][] = []
    backtracking(0, [])
    return res

};
//leetcode submit region end(Prohibit modification and deletion)
